/********************************************************************************
  * @file     SD93F115B_pwr.c   						    	
  * @author   TEST TEAM 												    	
  * @version  v0															    	
  * @date     Septemper 2022												    	
  * @brief
  *
  * Copyright (C) 2022  Hangzhou SDIC Microelectronics Co., Ltd
**********************************************************************************/

/* Includes*/
    
#include "SD93F115B_pwr.h"
#include "SD93F115B_rcc.h"

/*-----------------------------------------------
 * 函数功能：BG使能
 * 入口参数：NewState: ENABLE或者DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *-----------------------------------------------*/ 
void PWR_BGCmd(FunctionalState NewState)
{
	/* Check the parameters */
	assert_param(IS_FUNCTIONAL_STATE(NewState));	
	if (NewState != DISABLE)
	{
		PWR->BG_CR |= BG_CR_BGEN;
	}
	else
	{
		PWR->BG_CR &=~BG_CR_BGEN;	
	}		
} 

/*-----------------------------------------------
 * 函数功能：配置ACM输出电压
 * 入口参数：PWR_ACMLevel: PWR_ACMLevel_VBG,PWR_ACMLevel_VNTAT,PWR_ACMLevel_AVDDR,PWR_ACMLevel_DAO
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *-----------------------------------------------*/ 
void PWR_ACMLevelConfig(uint32_t PWR_ACMLevel)
{
	/* Check the parameters */
	assert_param(IS_PWR_ACM_LEVEL(PWR_ACMLevel));
	
	uint32_t tmpreg=0;
	tmpreg=0xFFF9FFFF & PWR->AP_CR;
	
	PWR->AP_CR = PWR_ACMLevel|tmpreg;			
}
	
/*---------------------------------------------
 * 函数功能：ACM使能
 * 入口参数：NewState: ENABLE或者DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *--------------------------------------------*/ 
void PWR_ACMCmd(FunctionalState NewState)
{
	/* Check the parameters */
	assert_param(IS_FUNCTIONAL_STATE(NewState));	
	if (NewState != DISABLE)
	{
		PWR->AP_CR |= AP_CR_ACMEN;
	}
	else
	{
		PWR->AP_CR &=~AP_CR_ACMEN;	
	}			
}

/*******************************AVDDR********************************/
/*-------------------------------------------
 * 函数功能：AVDDR_IBLEED使能,开启增增加一个小电流负载以增强稳定性，可关闭节省电流
 * 入口参数：NewState: ENABLE或者DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *-------------------------------------------*/ 
void PWR_AVDDR_IBLEEDCmd(FunctionalState NewState)
{
	/* Check the parameters */
	assert_param(IS_FUNCTIONAL_STATE(NewState));	
	if (NewState != DISABLE)
	{
		PWR->AP_CR |= AP_CR_AVDDR_IBLEEDEN;
	}
	else
	{
		PWR->AP_CR &=~AP_CR_AVDDR_IBLEEDEN;	
	}			
}

/*-------------------------------------------------
 * 函数功能：AVDDR输出电压
 * 入口参数：PWR_AVDDRLevel: PWR_AVDDRLevel_2V4,PWR_AVDDRLevel_2V7,PWR_AVDDRLevel_3V0,PWR_AVDDRLevel_3V3\
 *           PWR_AVDDRLevel_3V6,PWR_AVDDRLevel_3V9,PWR_AVDDRLevel_4V2,PWR_AVDDRLevel_4V5
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *-------------------------------------------------*/ 
void PWR_AVDDRLevelConfig(uint32_t PWR_AVDDRLevel)
{
	/* Check the parameters */
	assert_param(IS_PWR_AVDDR_LEVEL(PWR_AVDDRLevel));
	
	uint32_t tmpreg=0;
	tmpreg=0xFFFFFFF1 & PWR->AP_CR;
	
	PWR->AP_CR =PWR_AVDDRLevel|tmpreg;		
}
	
/*-------------------------------------------
 * 函数功能：AVDDR使能
 * 入口参数：NewState: ENABLE或者DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *-------------------------------------------*/ 
void PWR_AVDDRCmd(FunctionalState NewState)
{
	/* Check the parameters */
	assert_param(IS_FUNCTIONAL_STATE(NewState));	
	if (NewState != DISABLE)
	{
		PWR->AP_CR |= AP_CR_AVDDREN;
	}
	else
	{
		PWR->AP_CR &=~AP_CR_AVDDREN;	
	}			
} 
/********************************DVDDR**************************************/ 
/*-------------------------------------------------
 * 函数功能：DVDDR参考电压选择
 * 入口参数：PWR_DVDDRVREFSEL: PWR_DVDDR_VREF_LPBG,PWR_DVDDR_VREF_BGCHOP
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *-------------------------------------------------*/ 
void PWR_DVDDRVREFSEL(uint32_t PWR_DVDDRVREFSEL)
{
	/* Check the parameters */
	assert_param(IS_PWR_DVDDR_VREFSEL( PWR_DVDDRVREFSEL));
	
	uint32_t tmpreg=0;
	tmpreg=0xFFDFFFFF & PWR->DLDO_CR;	
	
	tmpreg |= PWR_DVDDRVREFSEL<<21;
	PWR->DLDO_CR =tmpreg;

}

/*--------------------------------------------------
 * 函数功能：使能DVDDR电压软件修改
 * 入口参数：NewState: ENABLE或者DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *--------------------------------------------------*/ 
void PWR_DVDDR_SOFTSTARTCmd(FunctionalState NewState)         
{
	/* Check the parameters */	
	assert_param(IS_FUNCTIONAL_STATE(NewState));	
	if (NewState == ENABLE)
	{	
		PWR->DLDO_CR |=DLDO_CR_DLDO_SOFTSTART_BYP ;							
	}
	else 
	{
		PWR->DLDO_CR &=~DLDO_CR_DLDO_SOFTSTART_BYP ;		
	}
}

/*--------------------------------------------------
 * 函数功能：使能DVDDR外挂电容（DVDDR外挂Cap时需要设为1，增强稳定性）
 * 入口参数：NewState: ENABLE或者DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *--------------------------------------------------*/ 
void PWR_DVDDR_EXTCAPSELCmd(FunctionalState NewState)         
{
	/* Check the parameters */	
	assert_param(IS_FUNCTIONAL_STATE(NewState));	
	if (NewState == ENABLE)
	{	
		PWR->DLDO_CR |=DLDO_CR_DLDO_EXTCAPSEL ;							
	}
	else 
	{
		PWR->DLDO_CR &=~DLDO_CR_DLDO_EXTCAPSEL ;		
	}
}

/*--------------------------------------------------
 * 函数功能：使能DVDDR小电流负载（开启增增加一个小电流负载以增强稳定性，可关闭节省40uA电流）
 * 入口参数：NewState: ENABLE或者DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *--------------------------------------------------*/ 
void PWR_DVDDR_IBLEEDENCmd(FunctionalState NewState)         
{
	/* Check the parameters */	
	assert_param(IS_FUNCTIONAL_STATE(NewState));	
	if (NewState == ENABLE)
	{	
		PWR->DLDO_CR |=DLDO_CR_DLDO_IBLEEDEN ;							
	}
	else 
	{
		PWR->DLDO_CR &=~DLDO_CR_DLDO_IBLEEDEN ;		
	}
}

/*-------------------------------------------------
 * 函数功能：DVDDR LDO settle time设置
 * 入口参数：PWR_DVDDRSTLTM: PWR_DVDDR_STLTM_64ms、PWR_DVDDR_STLTM_32ms、PWR_DVDDR_STLTM_16ms、PWR_DVDDR_STLTM_8ms
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *-------------------------------------------------*/ 
void PWR_DVDDRSTLTMConfig(uint32_t PWR_DVDDRSTLTM)
{
	/* Check the parameters */
	assert_param(IS_PWR_DVDDR_STLTM( PWR_DVDDRSTLTM));
	
	uint32_t tmpreg=0;
	tmpreg=0xFFFCFFFF & PWR->DLDO_CR;	
	
	PWR->DLDO_CR =(PWR_DVDDRSTLTM<<16)|tmpreg;

}

/*-------------------------------------------------
 * 函数功能：DVDDR输出电压
 * 入口参数：PWR_DVDDRLevel: PWR_DVDDRLevel_1V419,PWR_DVDDRLevel_1V465,PWR_DVDDRLevel_1V489,PWR_DVDDRLevel_1V502\
 *           PWR_DVDDRLevel_1V514,PWR_DVDDRLevel_1V527,PWR_DVDDRLevel_1V554,PWR_DVDDRLevel_1V609
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *-------------------------------------------------*/ 
void PWR_DVDDRLevelConfig(uint8_t PWR_DVDDRLevel)
{
	/* Check the parameters */
	assert_param(IS_PWR_DVDDR_LEVEL(PWR_DVDDRLevel));
	
	uint8_t tmpreg=0;
	tmpreg=0xF8 & PWR->DLDO_CR;	
	
	PWR->DLDO_CR =PWR_DVDDRLevel|tmpreg;

}

/*-----------------------------------------------
 * 函数功能：使能DVDDR低电压检测
 * 入口参数：NewState: ENABLE或者DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *-----------------------------------------------*/ 
void PWR_LVDCmd(FunctionalState NewState)         
{		
	/* Check the parameters */	
	assert_param(IS_FUNCTIONAL_STATE(NewState));	
	if (NewState == ENABLE)
	{	
		RCC->LVD_CR|=LVD_CR_LVDEN;							
	}
	else 
	{
		RCC->LVD_CR &=~LVD_CR_LVDEN;		
	}	
}
	
/*--------------------------------------------------
 * 函数功能：使能FALSH低功耗处理
 * 入口参数：NewState: ENABLE或者DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *--------------------------------------------------*/ 
void PWR_FlashLowpwrCmd(FunctionalState NewState)         
{
	/* Check the parameters */	
	assert_param(IS_FUNCTIONAL_STATE(NewState));	
	if (NewState == ENABLE)
	{	
		FLASH->ACR|=FLASH_ACR_LPEN ;							
	}
	else 
	{
		FLASH->ACR &=~FLASH_ACR_LPEN ;		
	}
}

/*******************************DAC********************************************/
/*-------------------------------------------------------
 * 函数功能：初始化DAC相关参数
 * 入口参数：PWR_DACInitStruct: pointer to a PWR_DACInitStruct structure that
 *           contains the configuration information for the specified DAC peripheral. 
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *-------------------------------------------------------*/ 
void PWR_DACInit(DAC_InitTypeDef*PWR_DACInitStruct)
{
	
	PWR_DACChannelConfig(PWR_DACInitStruct->DACP,PWR_DACInitStruct->DACN);
	PWR_DAENCmd(PWR_DACInitStruct->DAC_DAEN);
    PWR_SetDACCode(PWR_DACInitStruct->DACCode);
 
}
 
/*------------------------------------------------------
 * 函数功能：配置DAC通道
 * 入口参数：DACP,DACN
 * 			 DACP: 可设置为0x00~0x09或0x0F
 *           DACN: 可设置为0x00~0x05
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *------------------------------------------------------*/ 
void PWR_DACChannelConfig(uint8_t DACP,uint8_t DACN)
{
	/* Check the parameters */	
	assert_param(IS_PWR_DAC_InputPositiveChannel(DACP));
	assert_param(IS_PWR_DAC_InputNegtiveChannel(DACN));
	
	uint32_t tmpreg=0;
	tmpreg=LBT->CR&0x80FFFFFF;
	tmpreg |=(uint32_t)DACP<<24;
	tmpreg |=(uint32_t)DACN<<28;
	
	LBT->CR=tmpreg;	
	
}

/*------------------------------------------------
 * 函数功能：使能DAC输入信号由AVDDR分压产生
 * 入口参数：NewState: ENABLE或者DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *------------------------------------------------*/ 
void PWR_DAENCmd(FunctionalState NewState)         
{
	/*Check the parameters*/ 
	assert_param(IS_FUNCTIONAL_STATE(NewState));

	if (NewState != DISABLE)
	{
		LBT->CR|=LBT_CR_DAEN;
	}
	else
	{
		LBT->CR&=~LBT_CR_DAEN;	
	}
}

/*---------------------------------------------------
 * 函数功能：设置12位的DACCode 
 * 入口参数：DACCode: 12位的DACCode,可设置为0x000~0xfff
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *---------------------------------------------------*/ 
void PWR_SetDACCode(uint16_t DACCode)                            
{
	/* Check the parameters */	
	assert_param(IS_PWR_DAC_Code(DACCode));
	
	uint32_t tmpreg=0;
	
	tmpreg = LBT->CR2&0xFFFFF000;
	
	LBT->CR2 = tmpreg|((uint32_t)DACCode);
	
}

/*------------------------------------------------
 * 函数功能：使能DAC AUD输出
 * 入口参数：NewState: ENABLE或者DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *------------------------------------------------*/ 
void PWR_AUDENCmd(FunctionalState NewState)         
{
	/*Check the parameters*/ 
	assert_param(IS_FUNCTIONAL_STATE(NewState));

	if (NewState != DISABLE)
	{
		LBT->CR2|=LBT_CR2_AUD_OEN;
	}
	else
	{
		LBT->CR2&=~LBT_CR2_AUD_OEN;	
	}
}

/*------------------------------------------------
 * 函数功能：使能DAC DAO输出
 * 入口参数：NewState: ENABLE或者DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *------------------------------------------------*/ 
void PWR_DAOENCmd(FunctionalState NewState)         
{
	/*Check the parameters*/ 
	assert_param(IS_FUNCTIONAL_STATE(NewState));

	if (NewState != DISABLE)
	{
		LBT->CR2|=LBT_CR2_DAO_OEN;
	}
	else
	{
		LBT->CR2&=~LBT_CR2_DAO_OEN;	
	}
}

/***********************************LBT**************************************/
/*---------------------------------------------------------
 * 函数功能：初始LBT相关参数 
 * 入口参数：PWR_LBTInitStruct: pointer to a PWR_LBTInitStruct structure that
 *           contains the configuration information for the specified PWR peripheral. 
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *--------------------------------------------------------*/ 
void PWR_LBTInit(LBT_InitTypeDef* PWR_LBTInitStruct)
{   
	PWR_DACInit(&PWR_LBTInitStruct->PWR_DACInitStruct);  
	
    PWR_COMPDelay2uSCmd(PWR_LBTInitStruct->LBT_COMPDelay2uSEN);
    PWR_LBTINSELP30Cmd(PWR_LBTInitStruct->LBTINSELP30);

    PWR_COMPChannelConfig(PWR_LBTInitStruct->PWR_COMPP);
	
}	

/*----------------------------------------------------
 * 函数功能：使能P30为电池检测输入引脚
 * 入口参数：NewState: ENABLE或者DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *----------------------------------------------------*/
void PWR_LBTINSELP30Cmd(FunctionalState NewState)
{
	/* Check the parameters */
	assert_param(IS_FUNCTIONAL_STATE(NewState));
	
	if (NewState != DISABLE)
	{
		LBT->CR|=LBT_CR_LBTINSEL;
	}
	else
	{
		LBT->CR&=~LBT_CR_LBTINSEL;	
	}
}

/*-------------------------------------------------
 * 函数功能：使能比较器输出2us延时滤波
 * 入口参数：NewState: ENABLE或者DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *-------------------------------------------------*/ 
void PWR_COMPDelay2uSCmd(FunctionalState NewState)   
{
	/* Check the parameters */
	assert_param(IS_FUNCTIONAL_STATE(NewState));
	
	if (NewState != DISABLE)
	{
		LBT->CR|=LBT_CR_DELAYEN;
	}
	else
	{
		LBT->CR&=~LBT_CR_DELAYEN;	
	}
}

/*-----------------------------------------------------------
 * 函数功能：用于外部电池检测输入通道设置
 * 入口参数：PWR_COMPP: PWR_COMPP_VBG,PWR_COMPP_VSS,PWR_COMPP_A10,PWR_COMPP_A12,PWR_COMPP_P01,PWR_COMPP_P30
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *-----------------------------------------------------------*/
void PWR_COMPChannelConfig(uint32_t PWR_COMPP)
{
	/* Check the parameters */
	assert_param(IS_PWR_COMP_Channel(PWR_COMPP));	
	
	uint32_t tmpreg=0;
	tmpreg=LBT->CR&0xFFFFFFF8;
	
	LBT->CR=(tmpreg|PWR_COMPP);
	

}

/*-----------------------------------------------------------
 * 函数功能：使能LBT低压检测功能
 * 入口参数：NewState: ENABLE或者DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *-----------------------------------------------------------*/
void PWR_LBTCmd(FunctionalState NewState)
{
	/* Check the parameters */	
	assert_param(IS_FUNCTIONAL_STATE(NewState));
	
	if (NewState != DISABLE)
	{
		LBT->CR |= LBT_CR_COMPEN;
	}
	else
	{
		LBT->CR &= ~LBT_CR_COMPEN;	
	}
}
/*---------------------------------------
 * 函数功能：使能电池检测中断
 * 入口参数：NewState: ENABLE或者DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *----------------------------------------*/
void PWR_LBTITCmd(FunctionalState NewState)	
{
	/* Check the parameters */
	assert_param(IS_FUNCTIONAL_STATE(NewState));
	if (NewState != DISABLE)
	{
		LBT->CR|=LBT_CR_LBTIE;
	}
	else
	{
		LBT->CR&=~LBT_CR_LBTIE;	
	}
}

/*---------------------------------------
 * 函数功能：获取LBT中断标志位
 * 入口参数：None
 * 出口参数：None
 * 返回值  ：LBT中断标志位bitstatus
 * 编写日期：
 * 作者    ：
 *----------------------------------------*/
ITStatus PWR_GetLBTITStatus(void)    
{
	ITStatus bitstatus = RESET;
  
	if((LBT->SR & LBT_SR_LBTIF )==RESET)
	{		
		bitstatus =	RESET;		
	}		
	else 
	{
		bitstatus = SET;		
	}
	return bitstatus;
}

/*---------------------------------------
 * 函数功能：清除LBT中测标志位
 * 入口参数：None
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *----------------------------------------*/
void PWR_ClearLBTITStatus(void)
{
	LBT->SR|=LBT_SR_LBTIF;
} 

/****************************************TouchKey*************************************/
/*------------------------------------------------------------------------
 * 函数功能：使能触摸按键检测功能，并选择触摸按键的输入通道
 * 入口参数：PWR_CAPMS,NewState
 * 			 PWR_CAPMS: PWR_CAPMS_P00,PWR_CAPMS_P01,PWR_CAPMS_A12,PWR_CAPMS_A11,PWR_CAPMS_A9,PWR_CAPMS_A8
 *           NewState: ENABLE或者DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *------------------------------------------------------------------------*/
void PWR_TouchKeyChannelConfig(uint8_t PWR_CAPMS,FunctionalState NewState)
{
	/* Check the parameters */
	assert_param(IS_PWR_TouchKey_Channel(PWR_CAPMS));
	assert_param(IS_FUNCTIONAL_STATE(NewState));
	
	uint8_t tmpreg=0;	
	tmpreg=0xF1&LBT->CAPM_CR;
	
	LBT->CAPM_CR=PWR_CAPMS|tmpreg;
	
    if (NewState != DISABLE)
	{
		LBT->CAPM_CR|=CAPM_CR_CAPMEN;
	}
	else
	{
		LBT->CAPM_CR&=~CAPM_CR_CAPMEN;
	}
	
}



/****************************END OF FILE****************************/